#include "iosensor.h"
#include "driver_tool.h"
#include "adc.h"
#include "gpio.h"
#include "main.h"
#include "driver_adc.h"
#include "driver_delay.h"


typedef struct {
    uint8_t init_control;
    uint8_t init_people;
    uint8_t init_smoke;
    uint8_t init_fun;
} SENSOR_INIT;

SENSOR_INIT g_sensor_init = {0};

// 获取光照传感器的检测值 光照传感器使用ADC
uint32_t get_light(void)
{
    float voltage_data = 0;
    float lumen = 0;
    voltage_data = get_voltage(1);

    // 光照强度单位是流明，这里最大为1000,对应电压为3.3V
    lumen = voltage_data / 3.3 * 1000;
    // GUA_LOGI("light: %.1f %.1f", voltage_data, lumen);

    return lumen;
}


void beep_ding(void)
{
    HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_SET);
    delay_ms(20);
    HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET);
}


void play_music(uint8_t temp)
{
    switch (temp)
    {
        case 1: {
            HAL_GPIO_WritePin(IN1_GPIO_Port, IN1_Pin, GPIO_PIN_RESET);
            delay_ms(100);
            HAL_GPIO_WritePin(IN1_GPIO_Port, IN1_Pin, GPIO_PIN_SET);
        } break;
        case 2: {
            HAL_GPIO_WritePin(IN2_GPIO_Port, IN2_Pin, GPIO_PIN_RESET);
            delay_ms(100);
            HAL_GPIO_WritePin(IN2_GPIO_Port, IN2_Pin, GPIO_PIN_SET);
        } break;
        case 3: {
            HAL_GPIO_WritePin(IN3_GPIO_Port, IN3_Pin, GPIO_PIN_RESET);
            delay_ms(100);
            HAL_GPIO_WritePin(IN3_GPIO_Port, IN3_Pin, GPIO_PIN_SET);
        } break;
        case 4: {
            HAL_GPIO_WritePin(IN4_GPIO_Port, IN4_Pin, GPIO_PIN_RESET);
            delay_ms(100);
            HAL_GPIO_WritePin(IN4_GPIO_Port, IN4_Pin, GPIO_PIN_SET);
        } break;
        default:
            break;
    }

}


// 设置风扇
void set_fun(uint8_t temp)
{
    if (g_sensor_init.init_fun !=  1) {
        g_sensor_init.init_fun = 1;
        GPIO_InitTypeDef GPIO_InitStruct = {0};
        __HAL_RCC_GPIOA_CLK_ENABLE();

        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_RESET);

        GPIO_InitStruct.Pin = GPIO_PIN_1;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
        HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    }

    if (temp) {
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_SET);
    } else {
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_RESET);
    }
}


// 风速
float get_wind_speed(void)
{
    float voltage_data = 0;
    float speed = 0;
    voltage_data = get_voltage(0);

    // 风速直接使用了电压值
    speed = voltage_data*1000;
    // GUA_LOGI("speed: %.3f", speed);

    return speed;
}


// 获取风向
uint32_t get_wind_direction(void)
{
    float voltage_data = 0;
    float direction = 0;
    voltage_data = get_voltage(1);

    direction = (voltage_data*1000);
    // GUA_LOGI("direction: %.3f", direction);
    // 0 668 1392 2110
	if (direction < 500) {
        return 0;
    } else if (direction <1000 ) {
        return 90;
    } else if (direction < 1800) {
        return 180;
    } else if (direction < 3000) {
        return 270;
    } else {
        return 0;
    }
}


// 继电器控制
void set_control(uint8_t setting)
{
    if (g_sensor_init.init_control !=  1) {
        g_sensor_init.init_control = 1;
        GPIO_InitTypeDef GPIO_InitStruct = {0};
        __HAL_RCC_GPIOA_CLK_ENABLE();

        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);

        GPIO_InitStruct.Pin = GPIO_PIN_12;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    }

    if (setting) {
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);
    } else {
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET);
    }
}


// 获取人体传感器
uint8_t get_people(void)
{
    if (g_sensor_init.init_people !=  1) {
        g_sensor_init.init_people = 1;
        GPIO_InitTypeDef GPIO_InitStruct = {0};
        __HAL_RCC_GPIOA_CLK_ENABLE();

        GPIO_InitStruct.Pin = GPIO_PIN_6;
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    }

    return HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6);
}



// 获取烟雾气体
// 使用MQ-2烟雾传感器模块的数字引脚，该引脚在正常情况会输出高电平，在有可燃气体的情况会输出低电平
uint8_t get_smoke(void)
{
    if (g_sensor_init.init_smoke !=  1) {
        g_sensor_init.init_smoke = 1;
        GPIO_InitTypeDef GPIO_InitStruct = {0};
        __HAL_RCC_GPIOA_CLK_ENABLE();

        GPIO_InitStruct.Pin = GPIO_PIN_3;
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    }

    return !HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_3);
}


uint32_t get_soil_humidity(void) // 获取土壤湿度
{
    float voltage_data = 0;
    uint32_t humidity = 0;
    voltage_data = get_voltage(0);

    // 土壤湿度检测模块，模拟量最大输出3.0V，对应湿度100
    humidity = 100- ((uint32_t)((voltage_data / 3) * 100));
    GUA_LOGI("get_soil_humidity: %.1f %d", voltage_data, humidity);

    return humidity;
}



